package com.elvish.efast.system.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.elvish.efast.common.entity.TreeData;
import com.elvish.efast.model.entity.Menu;
import com.elvish.efast.service.MenuService;
import com.elvish.efast.system.dao.MenuDao;
import com.google.common.collect.Lists;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;

import javax.annotation.Resource;
import java.util.List;

/**
 * (TMenu)表服务实现类
 *
 * @author makejava
 * @since 2018-11-02 11:39:32
 */
@Service(interfaceClass = MenuService.class)
public class MenuServiceImpl implements MenuService {
    @Resource
    private MenuDao tMenuDao;

    /**
     * 获取树形结构数据
     *
     * @return 树形结构数据
     */
    @Override
    public List<TreeData> getTreeData() {
        return this.tMenuDao.getTreeData();
    }

    /**
     * 获取菜单树
     *
     * @return 对象列表
     */
    @Override
    public List<Menu> getMenuTree() {
        List<Menu> root = Lists.newArrayList();
        List<Menu> menus = queryAllByLimit(0, 999);
        if (!Lang.isEmpty(menus)) {
            for (Menu child : menus) {
                String pid = child.getPid();
                // 一级
                if (Strings.isBlank(pid) || "-1".equals(pid)) {
                    root.add(child);
                } else {
                    // 一级以下
                    for (Menu parent : menus) {
                        String id = parent.getId();
                        if (pid.equals(id)) {
                            if (parent.getChildren() == null) {
                                List<Menu> children = Lists.newArrayList();
                                parent.setChildren(children);
                            }
                            parent.getChildren().add(child);
                        }
                    }
                }
            }
        }
        return root;
    }


    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public Menu queryById(String id) {
        return this.tMenuDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @return 对象列表
     */
    @Override
    public List<Menu> queryAll(Menu menu) {
        return this.tMenuDao.queryAll(menu);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<Menu> queryAllByLimit(int offset, int limit) {

        return this.tMenuDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param tMenu 实例对象
     * @return 实例对象
     */
    @Override
    public Menu insert(Menu tMenu) {
        this.tMenuDao.insert(tMenu);
        return tMenu;
    }

    /**
     * 修改数据
     *
     * @param tMenu 实例对象
     * @return 实例对象
     */
    @Override
    public Menu update(Menu tMenu) {
        this.tMenuDao.update(tMenu);
        return this.queryById(tMenu.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Menu menu) {
        List<Menu> menus = getByPid(menu.getId());
        if (menus == null) {
            menus = Lists.newArrayList();
        }
        menus.add(menu);
        return this.tMenuDao.deleteByIds(menus) > 0;
    }

    /**
     * 父找子
     *
     * @param pid 父主键
     * @return 对象列表
     */
    @Override
    public List<Menu> getByPid(String pid) {
        return this.tMenuDao.getByPid(pid);
    }
}